Linux 环境变量

很多程序和脚本都通过环境变量来获取系统信息,存储临时数据和配置信息。

Ubuntu配置文件在 /etc/profile/

什么是环境变量

bash shell 用一个叫做环境变量的特性来存储有关shell对话和工作环境的信息。这项特性允许你在内存存储数据,以便程序或者shell中运行的脚本能够轻松访问到他们。这也是存储持久数据的一种简便方法。

两类环境变量

  • 全局变量
  • 局部变量

全局变量

全局环境变量对于shell会话和所有生成的子shell都是可见的,局部变量则只对创建他们的shell可见。

系统在开始bash会话时就设置了一些全局环境变量,系统全局变量基本全是大写字母以进行区分。

查看全部变量,可以使用env或者printenv 命令。显示特定的某个环境变量 printenv 变量

也可以使用echo 显示变量的值,这种方式必须在变量前加$. 这种方式还可以让变量变成参数。所以可以这样用ls \$ HOME (没有反斜杠)

局部环境变量

局部环境变量只能在定义他们的进程中可见。系统也默认定义了标准的局部环境变量,不过也可以定义自己的局部变量,这些变量被称为用户定义局部变量。

set命令会显示为某个特定进程设置的所有环境变量,包括局部变量,全局变量以及用户定义变量。

设置用户定义变量

设置局部用户自定义变量

一旦启动了bash shell(或者执行一个shell脚本),就能创建在这个shell进程内可见的局部变量了。可以通过等号给环境变量赋值,值可以是数值或字符串。变量名、等号和值之间没有空格。

1
2
3
4
5
$ echo $my_variable
$ my_variable="Hello" //有空格的时候必须加引号。
$
$ echo $my_variable
Hello

设置全局环境变量

创建全局变量的方法时先创建一个局部环境变量,然后再把它导入到全局环境中。这个过程使用export命令来完成。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ my_variable="I am Global now"
$
$ export my_variable
$
$ echo $my_variable
I am Global now
$
$ bash
$
$ echo $my_variable
I am Global now
$
$ exit
exit
$
$ echo $my_variable
I am Global now
$

删除环境变量

使用unset命令删除环境变量。使用unset时,不使用$

1
2
3
4
$ echo $my_variable
I am Global now
$ unset my_variable
$ echo $my_variable

设置PATH环境变量

当你在shell命令行界面中输入一个外部命令时(参见第5章),shell必须搜索系统来找到对应的程序。PATH环境变量定义了用于进行命令和程序查找的目录。

添加新目录到path环境变量中
1
2
3
4
5
6
7
8
9
10
11
考下面的例子。
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:
/sbin:/bin:/usr/games:/usr/local/games
$
$ PATH=$PATH:/home/christine/Scripts
$
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/ games:/usr/local/games:/home/christine/Scripts
$
要想一直有,还是要导出。

注销或者重启可以使修改生效,如果要使添加的环境变量马上生效

1
source /etc/profile

环境变量文件的更改

可以直接添加到环境变量PATH中。$PATH表示变量PATH的值,包含已有的目录

这种方法需要注意路径的顺序,如果遇到有同名的命令,那么PATH里面哪个目录先被查询,则那个目录下的命令就会被先执行:表示分隔符

1
2
3
4
5
# 加到PATH末尾
export PATH=$PATH:/path/to/your/dir

# 加到PATH开头
export PATH=/path/to/your/dir:$PATH

环境变量持久化

可以利用这些文件创建自己的永久性全局变量或局部变量。对全局环境变量来说(Linux系统中所有用户都需要使用的变量) ,可能更倾向于将新的或修改过的变量设置放在/etc/profile文件中,但这可不是什么好主意。如果你升级了所用的发行版。这个文件也会跟着更新,那你所有定制过的变量设置可就都没有了。
最好是在/etc/profile.d目录中创建一个以.sh结尾的文件。把所有新的或修改过的全局环境变量设置放在这个文件中。

在大多数发行版中,存储个人用户永久性bash shell变量的地方是 HOME/.bashrc文件。这一点适用于所有类型的shell进程。但如果设置了 BASH_ENV 变量,那么记住,除非它指向的是$HOME/.bashrc,否则你应该将非交互式shell的用户变量放在别的地方。